package com.saver.view;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.saver.R;
import com.saver.core.domain.Banco;
import com.saver.core.domain.Categoria;
import com.saver.core.domain.Establecimiento;
import com.saver.core.domain.EstablecimientoEquiv;
import com.saver.core.domain.Transaccion;
import com.saver.core.persistence.DBManager;
import com.saver.core.persistence.EstablecimientoRestService;
import com.saver.core.persistence.bean.ItemEstablecimiento;
import com.saver.core.processor.EstadoTransaccion;
import com.saver.core.processor.TipoRegistro;
import com.saver.core.processor.TipoToken;
import com.saver.core.processor.util.Util;
import com.saver.core.util.Constantes;
import com.saver.core.util.DateUtil;
import com.saver.view.adapter.PlacesAutoCompleteAdapter;
import com.saver.view.adapter.ResetAutoComplete;

public class EditarTransaccionActivity extends Activity implements ResetAutoComplete {

    private static final String TAG = "EditarTransaccion";

    private Button botonFecha;
    private Spinner banco;
    private Spinner categoria;
    private AutoCompleteTextView establecimiento;
    private EditText monto;

    EstablecimientoRestService establecimientoRestService;
    private Transaccion transaccion;
    private ItemEstablecimiento itemEstablecimiento;
    private List<Categoria> categorias;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editar_transaccion);

        DBManager.initialize(this);

        Integer idTransaccion = getPrametro();
        if (idTransaccion != null) {
            Log.d(TAG, "idTransaccion: " + idTransaccion);
            transaccion = DBManager.transaccionSQLite().buscarPorId(idTransaccion);
        }

        // bancos
        banco = (Spinner) findViewById(R.id.banco);
        ArrayList<Item> itemsBanco = new ArrayList<Item>();
        int bancoSel = -1;
        Integer idBanco = transaccion == null ? null : transaccion.getIdBanco();
        Log.d(TAG, "idBanco: " + idBanco);
        List<Banco> bancos = DBManager.bancoSQLite().buscarTodoActivo();
        for (int i = 0, n = bancos.size(); i < n; i++) {
            Banco b = bancos.get(i);
            itemsBanco.add(new Item(b.getId(), b.getNombre()));
            if (b.getId().equals(idBanco)) {
                bancoSel = i;
            }
        }
        banco.setAdapter(new ArrayAdapter<Item>(this, android.R.layout.simple_spinner_item, itemsBanco));
        if (bancoSel >= 0) {
            banco.setSelection(bancoSel);
        }

        // categorias
        categoria = (Spinner) findViewById(R.id.categoria);
        ArrayList<Item> itemsCategoria = new ArrayList<Item>();
        Integer idCategoria = transaccion == null ? null : transaccion.getIdCategoria();
        Log.d(TAG, "idCategoria: " + idCategoria);
        categorias = DBManager.categoriaSQLite().buscarTodo();
        for (int i = 0, n = categorias.size(); i < n; i++) {
            Categoria c = categorias.get(i);
            itemsCategoria.add(new Item(c.getId(), c.getNombre()));
        }
        categoria.setAdapter(new ArrayAdapter<Item>(this, android.R.layout.simple_spinner_item, itemsCategoria));
        seleccionarCategoria(idCategoria);
//        Integer idCategoriaEquiv = transaccion == null ? null : transaccion.getIdCategoriaEquiv();
//        TextView catEquivText = (TextView) findViewById(R.id.categoriaEquiv);
//        if (idCategoriaEquiv != null) {
//            CategoriaEquiv categoriaEquiv = DBManager.categoriaEquivSQLite().buscarPorId(idCategoriaEquiv);
//            catEquivText.setText(categoriaEquiv.getNombre());
//        } else {
//            catEquivText.setText("");
//        }

        // establecimientos
        establecimientoRestService = new EstablecimientoRestService();
        establecimiento = (AutoCompleteTextView) findViewById(R.id.establecimiento);
        establecimiento.setAdapter(new PlacesAutoCompleteAdapter(this, R.layout.item_establecimiento,
                DBManager.establecimientoSQLite(), establecimientoRestService, this));
        Integer idEstablecimiento = transaccion == null ? null : transaccion.getIdEstablecimiento();
        Log.d(TAG, "idEstablecimiento: " + idEstablecimiento);
        if (idEstablecimiento != null) {
            Establecimiento estab = DBManager.establecimientoSQLite().buscarPorId(idEstablecimiento);
            Log.d(TAG, "establecimiento: " + establecimiento);
            Log.d(TAG, "estab: " + estab);
            establecimiento.setText(estab.getNombre());
        }
        establecimiento.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Object item = parent.getItemAtPosition(position);
                seleccionarEstabl((ItemEstablecimiento) item);
            }
        });
        Integer idEstabEquiv = transaccion == null ? null : transaccion.getIdEstablecimientoEquiv();
        TextView estEquivText = (TextView) findViewById(R.id.nomEstablEquiv);
        if (idEstabEquiv != null) {
            EstablecimientoEquiv establecimientoEquiv = DBManager.establecimientoEquivSQLite().buscarPorId(idEstabEquiv);
            estEquivText.setText(establecimientoEquiv.getNombre());
        } else {
            estEquivText.setText("");
        }

        // monto
        monto = (EditText) findViewById(R.id.monto);
        if (transaccion != null && transaccion.getMonto() != null) {
            Log.d(TAG, "Monto: " + transaccion.getMonto());
            monto.setText(String.valueOf(transaccion.getMonto()));
        }

        Date fecha = new Date();
        String fechaActual = DateUtil.FORMATO_GENERAL.format(fecha);

        botonFecha = (Button)findViewById(R.id.fecha);
        botonFecha.setText(fechaActual);
        if (transaccion == null) {
            botonFecha.setEnabled(false);
        }
    }

    private Integer getPrametro() {
        if (getIntent() != null) {
            if (getIntent().getExtras() != null) {
                return (Integer) getIntent().getExtras().get("idTransaccion");
            }
        }
        return null;
    }

    private void seleccionarEstabl(ItemEstablecimiento item) {
        Log.d(TAG, "item: " + item);
        itemEstablecimiento = item;
        seleccionarCategoria(itemEstablecimiento.getIdCatServ());
    }

    private void seleccionarCategoria(Integer idCategoria) {
        Log.d(TAG, "idCategoria: " + idCategoria);
        if (idCategoria == null) {
            idCategoria = 1; // otros
        }
        int categoriaSel = -1;
        for (int i = 0, n = categorias.size(); i < n; i++) {
            Categoria c = categorias.get(i);
            if (c.getId().equals(idCategoria)) {
                categoriaSel = i;
            }
        }
        Log.d(TAG, "categoriaSel: " + categoriaSel);
        if (categoriaSel >= 0) {
            categoria.setSelection(categoriaSel);
        }
    }

    @Override
    public void reset() {
        Log.d(TAG, "reset");
        itemEstablecimiento = null;
    }

    public void grabarTransaccion(View view) {
        Log.d(TAG, "grabarTransaccion");

        if (transaccion == null) {
            transaccion = new Transaccion();
            transaccion.setEstado(EstadoTransaccion.NUEVO.getValor());
        } else {
            transaccion.setEstado(EstadoTransaccion.ACTUALIZADO.getValor());
        }

        transaccion.setTipo(TipoToken.EGRESO.getId());
        transaccion.setRevisado(Constantes.TRANSACCION_REVISADA);

        Item itemBanco = (Item) banco.getSelectedItem();
        Log.d(TAG, "itemBanco: " + itemBanco);
        transaccion.setIdBanco(itemBanco.getId());

        Item itemCategoria = (Item) categoria.getSelectedItem();
        Log.d(TAG, "itemCategoria: " + itemCategoria);
        transaccion.setIdCategoria(itemCategoria.getId());

        String strMonto = monto.getText().toString();
        double valMonto = Util.esVacio(strMonto) ? 0 : Double.parseDouble(strMonto);
        Log.d(TAG, "valMonto: " + valMonto);
        if (valMonto <= 0) {
            Toast.makeText(this, "El monto debe ser mayor a cero", Toast.LENGTH_LONG).show();
            return;
        }
        transaccion.setMonto(valMonto);

        Log.d(TAG, "itemEstablecimiento: " + itemEstablecimiento);
        // ha seleccionado un establecimiento
        if (itemEstablecimiento != null) {
            Establecimiento establecimiento = DBManager.establecimientoSQLite().buscarPorIdServidor(itemEstablecimiento.getIdServ());
            transaccion.setIdEstablecimiento(establecimiento.getIdEstablecimiento());

        } else {
            String texto = establecimiento.getText().toString();
            if (Util.noEsVacio(texto)) {
                Establecimiento establecimiento = new Establecimiento();
                establecimiento.setIdCategoria(itemCategoria.getId());
                establecimiento.setIdServidor(null);
                establecimiento.setNombre(texto.trim());
                establecimiento.setTipo(TipoRegistro.USUARIO.getValor());

                DBManager.establecimientoSQLite().guardar(establecimiento);

                transaccion.setIdEstablecimiento(establecimiento.getIdEstablecimiento());
            }
        }

        try {
            Date date = DateUtil.FORMATO_GENERAL.parse(botonFecha.getText().toString());
            transaccion.setFechaTransaccion(date.getTime());
            transaccion.setFechaText(Util.getStringToDateTime(date));
        } catch (ParseException e) {
            Log.d(TAG, "error de parseo", e);
        }

        transaccion.setIdCategoria(itemCategoria.getId());

        if (EstadoTransaccion.NUEVO.getValor() == transaccion.getEstado()) {
            DBManager.transaccionSQLite().guardar(transaccion);
        } else {
            DBManager.transaccionSQLite().actualizar(transaccion);
        }

        finish();
    }

    public void cerrarVentana(View view) {
        finish();
    }

    public void modificarFecha(View view) {
        DatePickerFragment fragment = new DatePickerFragment();
        fragment.setBotonFecha(botonFecha);
        fragment.show(getFragmentManager(), "datePicker");
    }

    public void eliminarRegistro(View view) {
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case DialogInterface.BUTTON_POSITIVE:
                        eliminar();
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        break;
                }
            }
        };

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("\u00BFUsted est\u00E1 seguro de eliminar el registro?").setPositiveButton("Si", dialogClickListener)
                .setNegativeButton("No", dialogClickListener).show();
    }

    public void eliminar() {
        DBManager.transaccionSQLite().eliminar(transaccion);
        finish();
    }

    private class Item {

        private Integer id;
        private String texto;

        public Item(Integer id, String texto) {
            this.id = id;
            this.texto = texto;
        }

        public Integer getId() {
            return id;
        }

        public String getTexto() {
            return texto;
        }

        @Override
        public String toString() {
            return getTexto();
        }
    }
}
